package com.dpj.exercise;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.Random;

@Slf4j(topic = "c.Transfer")
public class Transfer {
    @SneakyThrows
    public static void main(String[] args) {
        Account a=new Account(1000);
        Account b=new Account(1000);
        Thread t1=new Thread(()->{
           for(int i=0;i<1000;i++){
               a.transfer(b,randomAmount());
           }
        },"t1");

        Thread t2=new Thread(()->{
            for(int i=0;i<1000;i++){
                b.transfer(a,randomAmount());
            }
        },"t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();
        //看看转账2000此后的总金额
        log.debug("total:{}",(a.getMoney()+ b.getMoney()));

    }

    //random为线程安全
    static Random random=new Random();
    //1-100
    public static int randomAmount(){
        return random.nextInt(100)+1;
    }
}

class Account{
    private  int money;
    public Account(int money ){
        this.money=money;
    }

    public int getMoney(){
        return money;
    }
    public void setMoney(int money) {
        this.money = money;
    }

    //转账
    public void transfer(Account target,int count){

        //此处为两个共享变量，所以不能在方法上加锁（在方法上加锁只能锁住当前对象，不能锁住另一个target对象）
        //此处我们加的是整个类的锁，只解决目前的问题但是加上后，同时只有这两个用户可以转账，别的用户无法转账
        synchronized (Account.class){
            if(this.money>=count){
                this.setMoney(this.getMoney()-count);
                target.setMoney(count+target.getMoney());

            }
        }

    }

}
